import Fetch from '../api/request'
import FormData from 'form-data'
const fs = require('fs')
const config = require('config')

module.exports = class EnvironmentController {
  /**
   * 环境列表
   * @param ctx
   * @returns {Promise<void>}
   */
  static async environment(ctx) {
    let resultRet = {}
    await Fetch.get({
      url: '/api/environments',
      ctx
    }).then((result) => {
      resultRet = result
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })

    resultRet.menu = config.get('menu')
    resultRet.wsUrl = config.get('wsUrl.basic')
    ctx.body = resultRet
  }

  /**
   * 获取环境域名
   * @param {*} ctx
   */
  static async getDomain(ctx) {
    let ret = {}
    await Fetch.get({
      url: '/api/common/domainname',
      ctx
    }).then((res) => {
      ret = res
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })

    ctx.body = ret
  }

  /**
   * 添加环境
   * @param {*} ctx
   */
  static async addEnvironment(ctx) {
    let resultRet = {}

    // 添加环境
    await Fetch.post({
      url: '/api/environments',
      ctx,
      params: ctx.request.body
    }).then((result) => {
      resultRet = result
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })
    ctx.body = resultRet
  }

  /**
   * 获取环境信息
   * @param {*} ctx
   */
  static async environmentDetail(ctx) {
    let ret = {}
    await Fetch.get({
      url: ctx.request.url,
      ctx
    }).then((res) => {
      ret = res
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })
    ctx.body = ret
  }

  /**
   * 环境编辑
   * @param {*} ctx
   */
  static async environmentEdit(ctx) {
    let ret = {}
    if (ctx.request.method === 'PUT') {
      await Fetch.put({
        url: ctx.request.url,
        ctx,
        params: ctx.request.body
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'DELETE') {
      await Fetch.delete({
        url: ctx.request.url,
        ctx
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    }
    ctx.body = ret
  }

  /**
   * 导入环境
   * @param {*} ctx
   */
  static async environmentImport(ctx) {
    let ret = {}

    let fd = new FormData()
    fd.append('fileData', fs.createReadStream(ctx.request.files.fileData.path), ctx.request.files.fileData.name)
    await Fetch.post({
      url: ctx.request.url,
      ctx,
      type: 'form',
      params: fd
    }).then((res) => {
      ret = res
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })

    ctx.body = ret
  }

  /**
   * 环境导出
   * @param {*} ctx
   */
  static async environmentExport(ctx) {
    let ret = {}
    await Fetch.get({
      url: ctx.request.url,
      ctx
    }).then((res) => {
      ret = res
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })
    ctx.body = ret
  }

  /**
   * 获取监控数据
   * @param ctx
   * @returns {Promise<void>}
   */
  static async getMonitor(ctx) {
    let ret = {cpu: [], memory: [], code: '0'}
    let environmentId = ctx.checkQuery('environmentId').value
    let podId = ctx.checkQuery('podId').value
    let params = {environmentId}
    // podId存在获取的是容器监控数据
    if (podId) {
      params.podId = podId
    }
    await Fetch.get({
      url: '/api/monitor/cpu/usageRate',
      ctx,
      params
    }).then((res) => {
      if (res && res.code === '0') {
        ret.cpu = res.data
      }
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })

    await Fetch.get({
      url: '/api/monitor/memory/usage',
      ctx,
      params
    }).then((res) => {
      if (res && res.code === '0') {
        ret.memory = res.data
      }
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })

    ctx.body = ret
  }

  /**
   * 获取环境信息
   * @param ctx
   * @returns {Promise<void>}
   */
  static async environmentInfo(ctx) {
    let environmentId = ctx.checkQuery('environmentId').value
    let ret = {}
    await Fetch.get({
      url: '/api/environments/' + environmentId + '/details',
      ctx
    }).then((res) => {
      if (res && res.code === '0') {
        ret = res
      }
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })

    await Fetch.get({
      url: '/api/environments/' + environmentId + '/environmentandresourcelimit',
      ctx
    }).then((res) => {
      if (res && res.code === '0') {
        ret.environmentInfo = res
      }
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })

    ctx.body = ret
  }

  /**
   * 添加服务
   * @param {*} ctx
   */
  static async serviceAdd(ctx) {
    let environmentId = ctx.checkBody('environmentId').value
    let groupId = ctx.checkBody('groupId').value
    let ret = {}
    await Fetch.post({
      url: '/api/environments/' + environmentId + '/groups/' + groupId + '/services',
      ctx,
      params: ctx.request.body
    }).then((res) => {
      ret = res
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })
    ctx.body = ret
  }

  /**
   * 环境配置集
   * @param {*} ctx
   */
  static async configSet(ctx) {
    let ret = {}
    // 获取配置集
    if (ctx.request.method === 'GET') {
      await Fetch.get({
        url: ctx.request.url,
        ctx
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'POST') {
      await Fetch.post({
        url: ctx.request.url,
        ctx,
        params: ctx.request.body
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'DELETE') {
      await Fetch.delete({
        url: ctx.request.url,
        ctx
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'PUT') {
      await Fetch.put({
        url: ctx.request.url,
        ctx,
        params: ctx.request.body
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    }
    ctx.body = ret
  }

  /**
   * 镜像库
   * @param {*} ctx
   */
  static async dockerhub(ctx) {
    let ret = {}
    if (ctx.request.method === 'GET') {
      await Fetch.get({
        url: ctx.request.url,
        ctx
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'POST') {
      await Fetch.post({
        url: ctx.request.url,
        ctx,
        params: ctx.request.body
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'DELETE') {
      await Fetch.delete({
        url: ctx.request.url,
        ctx
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'PUT') {
      await Fetch.put({
        url: ctx.request.url,
        ctx,
        params: ctx.request.body
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    }
    ctx.body = ret
  }

  /**
   * 存储索
   * @param {*} ctx
   */
  static async pvc(ctx) {
    let ret = {}
    // 获取存储索
    if (ctx.request.method === 'GET') {
      await Fetch.get({
        url: ctx.request.url,
        ctx
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'POST') {
      await Fetch.post({
        url: ctx.request.url,
        ctx,
        params: ctx.request.body
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'DELETE') {
      await Fetch.delete({
        url: ctx.request.url,
        ctx
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'PUT') {
      await Fetch.put({
        url: ctx.request.url,
        ctx,
        params: ctx.request.body
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    }
    ctx.body = ret
  }

  /**
   * 访问权
   * @param {*} ctx
   */
  static async accessRight(ctx) {
    let ret = {}
    if (ctx.request.method === 'GET') {
      await Fetch.get({
        url: ctx.request.url,
        ctx
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'POST') {
      await Fetch.post({
        url: ctx.request.url,
        ctx,
        params: ctx.request.body
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'DELETE') {
      await Fetch.delete({
        url: ctx.request.url,
        ctx
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    } else if (ctx.request.method === 'PUT') {
      await Fetch.put({
        url: ctx.request.url,
        ctx,
        params: ctx.request.body
      }).then((res) => {
        ret = res
      }).catch((err) => {
        ctx.errorHandle(ctx, err)
      })
    }
    ctx.body = ret
  }

  /**
   * 通过服务id获取服务组
   * @param {*} ctx
   */
  static async getServiceGroupByServiceId(ctx) {
    let ret = {}
    await Fetch.get({
      url: ctx.request.url,
      ctx
    }).then((res) => {
      ret = res
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })
    ctx.body = ret
  }

  /**
   * 获取环境事件
   * @param {*} ctx
   */
  static async events(ctx) {
    let ret = {}
    await Fetch.get({
      url: ctx.request.url,
      ctx
    }).then((res) => {
      ret = res
    }).catch((err) => {
      ctx.errorHandle(ctx, err)
    })
    ctx.body = ret
  }
}
